package com.yingoo.controller;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.NumericField;
import org.apache.lucene.index.FieldInfo;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;

import java.io.*;

/**
 * Created by admin on 2017/7/28.
 */
public class IndexHtml {
    public static void main(String[] argv) {
        Directory dir =  null;
        try {
            dir = FSDirectory.open(new File("F:/opt/lucene/index"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            Analyzer analyzer = new IKAnalyzer(true);
            IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_31, analyzer);
            iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE);
            final File docDir = new File("F:/opt/lucene/data");
            IndexWriter writer = new IndexWriter(dir, iwc);
            indexDocs(writer, docDir);
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    static void indexDocs(IndexWriter writer, File file)
            throws IOException {
        // do not try to index files that cannot be read
        if (file.canRead()) {
            if (file.isDirectory()) {
                String[] files = file.list();
                // an IO error could occur
                if (files != null) {
                    for (int i = 0; i < files.length; i++) {
                        indexDocs(writer, new File(file, files[i]));
                    }
                }
            } else {

                FileInputStream fis;
                try {
                    fis = new FileInputStream(file);
                } catch (FileNotFoundException fnfe) {
                    // at least on windows, some temporary files raise this exception with an "access denied" message
                    // checking if the file can be read doesn't help
                    return;
                }

                try {

                    // make a new, empty document
                    Document doc = new Document();

                    // Add the path of the file as a field named "path".  Use a
                    // field that is indexed (i.e. searchable), but don't tokenize
                    // the field into separate words and don't index term frequency
                    // or positional information:
                    Field pathField = new Field("path", file.getPath(), Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS);
                    System.out.println("path:"+file.getPath());
                    pathField.setIndexOptions(FieldInfo.IndexOptions.DOCS_ONLY);
                    doc.add(pathField);

                    // Add the last modified date of the file a field named "modified".
                    // Use a NumericField that is indexed (i.e. efficiently filterable with
                    // NumericRangeFilter).  This indexes to milli-second resolution, which
                    // is often too fine.  You could instead create a number based on
                    // year/month/day/hour/minutes/seconds, down the resolution you require.
                    // For example the long value 2011021714 would mean
                    // February 17, 2011, 2-3 PM.
                    NumericField modifiedField = new NumericField("modified");
                    modifiedField.setLongValue(file.lastModified());
                    doc.add(modifiedField);

                    // Add the contents of the file to a field named "contents".  Specify a Reader,
                    // so that the text of the file is tokenized and indexed, but not stored.
                    // Note that FileReader expects the file to be in UTF-8 encoding.
                    // If that's not the case searching for special characters will fail.
                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fis, "utf-8"));
                    String line = null;
                    int len=0;
                    StringBuffer sbf = new StringBuffer();
                    String createTime = null;
                    while( (line=bufferedReader.readLine())!=null )
                    {
                        if(len != 0)  // 处理换行符的问题
                        {
                            sbf.append("\r\n"+line);
                        }
                        else
                        {
                            createTime = line;
                        }
                        len++;

                    }

                    System.out.println(createTime);
                    doc.add(new Field("time",createTime,Field.Store.YES,Field.Index.NOT_ANALYZED));
                    doc.add(new Field("contents",sbf.toString(), Field.Store.YES, Field.Index.ANALYZED_NO_NORMS));
                    doc.add(new Field("contents", bufferedReader, Field.TermVector.YES));
//                    bufferedReader.close();

                    if (writer.getConfig().getOpenMode() == IndexWriterConfig.OpenMode.CREATE) {
                        // New index, so we just add the document (no old document can be there):
                        System.out.println("adding " + file);
                        writer.addDocument(doc);
                    } else {
                        // Existing index (an old copy of this document may have been indexed) so
                        // we use updateDocument instead to replace the old one matching the exact
                        // path, if present:
                        System.out.println("updating " + file);
                        writer.updateDocument(new Term("path", file.getPath()), doc);
                    }

                } finally {
                    fis.close();
                }
            }
        }

    }
}
